#include<iostream>
#include<memory>
#include <sstream>
#include<vector>
#include "jsoncpp/json/json.h"

void Serialization()
{
    //定义jsonvalue对象
    Json::Value val;
    //需要序列化的数据
    std::string name = "小明";
    int age = 18;
    std::vector<std::string> play = {"打篮球","游泳","健身","写代码"};
    val["姓名"] = name;
    val["年龄"] = age;
    //对于数组元素需要使用append插入到json当中
    for(auto i : play)
    {
        val["爱好"].append(i);
    }
    //定义StreamWriterBuilder类型定义
    Json::StreamWriterBuilder swb;
    //根据json最新的建议使用json提供的方法进行创建StreamWriter
    std::unique_ptr<Json::StreamWriter> sw (swb.newStreamWriter()) ;
    //将jsonvalue数据进行序列化到stringstream
    std::stringstream ss;
    int ret = sw->write(val,&ss);
    if(ret < 0)
    {
        std::cout<<"序列化写入失败\n";
        return;
    }
    std::cout<<ss.str()<<std::endl;
}

void Deserialization()
{
    //定义序列话好的数据， R"()" 是原始字符串 
    std::string str = R"({"姓名":"小红","年龄":19,"成绩":[80,90,100]})";
    Json::Value val;
    //构建反序列化对象
    Json::CharReaderBuilder rb;
    std::unique_ptr<Json::CharReader> cr(rb.newCharReader());
    std::string errs;
    //将数据进行反序列化 -- 反序列化失败消息会放进errs中
    bool ret = cr->parse(str.c_str(),str.c_str()+str.size(),&val,&errs);
    if(!ret)
    {
        std::cout<<"反序列化失败:"<<errs<<"\n";
        return;
    }
    //反序列化成功后会将数据放入闯进去的json::value中
    std::cout<<"姓名:"<<val["姓名"].asString()<<std::endl;
    std::cout<<"年龄:"<<val["年龄"].asInt()<<std::endl;
    int n = val["成绩"].size();
    for(int i = 0;i<n;i++)
        std::cout<<"成绩："<<val["成绩"][i].asFloat()<<std::endl;
    for(auto i : val["成绩"])
    {
        std::cout<<i.asFloat()<<" ";
    }
}

int main()
{
    Deserialization();
    return 0;
}